{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Digital Clustering Based on K-means (full version)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of instances in the dataset = 1797\n",
      "Number of features = 64\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.datasets import load_digits\n",
    "\n",
    "# We use the digits dataset for clustering.\n",
    "digits = load_digits()\n",
    "data = digits.data\n",
    "label = digits.target\n",
    "num_insts, num_feats = data.shape[0], data.shape[1]\n",
    "print(\"Number of instances in the dataset =\", num_insts)\n",
    "print(\"Number of features =\", num_feats)\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.,  0.,  0., 12., 13.,  5.,  0.,  0.],\n",
       "       [ 0.,  0.,  0., 11., 16.,  9.,  0.,  0.],\n",
       "       [ 0.,  0.,  3., 15., 16.,  6.,  0.,  0.],\n",
       "       [ 0.,  7., 15., 16., 16.,  2.,  0.,  0.],\n",
       "       [ 0.,  0.,  1., 16., 16.,  3.,  0.,  0.],\n",
       "       [ 0.,  0.,  1., 16., 16.,  6.,  0.,  0.],\n",
       "       [ 0.,  0.,  1., 16., 16.,  6.,  0.,  0.],\n",
       "       [ 0.,  0.,  0., 11., 16., 10.,  0.,  0.]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "digits.images[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.,  1.,  8., 12., 15., 14.,  4.,  0.],\n",
       "       [ 0.,  3., 11.,  8.,  8., 12., 12.,  0.],\n",
       "       [ 0.,  0.,  0.,  0.,  2., 13.,  7.,  0.],\n",
       "       [ 0.,  0.,  0.,  2., 15., 12.,  1.,  0.],\n",
       "       [ 0.,  0.,  0.,  0., 13.,  5.,  0.,  0.],\n",
       "       [ 0.,  0.,  0.,  0.,  9., 13.,  0.,  0.],\n",
       "       [ 0.,  0.,  7.,  8., 14., 15.,  0.,  0.],\n",
       "       [ 0.,  0., 14., 15., 11.,  2.,  0.,  0.]])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "digits.images[23]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "标签 3\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "i = 23\n",
    "plt.imshow(digits.images[i])\n",
    "print('标签',label[i])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.,  0.,  0., 12., 13.,  5.,  0.,  0.,  0.,  0.,  0., 11., 16.,\n",
       "        9.,  0.,  0.,  0.,  0.,  3., 15., 16.,  6.,  0.,  0.,  0.,  7.,\n",
       "       15., 16., 16.,  2.,  0.,  0.,  0.,  0.,  1., 16., 16.,  3.,  0.,\n",
       "        0.,  0.,  0.,  1., 16., 16.,  6.,  0.,  0.,  0.,  0.,  1., 16.,\n",
       "       16.,  6.,  0.,  0.,  0.,  0.,  0., 11., 16., 10.,  0.,  0.])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "digits.data[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ".. _digits_dataset:\n",
      "\n",
      "Optical recognition of handwritten digits dataset\n",
      "--------------------------------------------------\n",
      "\n",
      "**Data Set Characteristics:**\n",
      "\n",
      "    :Number of Instances: 5620\n",
      "    :Number of Attributes: 64\n",
      "    :Attribute Information: 8x8 image of integer pixels in the range 0..16.\n",
      "    :Missing Attribute Values: None\n",
      "    :Creator: E. Alpaydin (alpaydin '@' boun.edu.tr)\n",
      "    :Date: July; 1998\n",
      "\n",
      "This is a copy of the test set of the UCI ML hand-written digits datasets\n",
      "http://archive.ics.uci.edu/ml/datasets/Optical+Recognition+of+Handwritten+Digits\n",
      "\n",
      "The data set contains images of hand-written digits: 10 classes where\n",
      "each class refers to a digit.\n",
      "\n",
      "Preprocessing programs made available by NIST were used to extract\n",
      "normalized bitmaps of handwritten digits from a preprinted form. From a\n",
      "total of 43 people, 30 contributed to the training set and different 13\n",
      "to the test set. 32x32 bitmaps are divided into nonoverlapping blocks of\n",
      "4x4 and the number of on pixels are counted in each block. This generates\n",
      "an input matrix of 8x8 where each element is an integer in the range\n",
      "0..16. This reduces dimensionality and gives invariance to small\n",
      "distortions.\n",
      "\n",
      "For info on NIST preprocessing routines, see M. D. Garris, J. L. Blue, G.\n",
      "T. Candela, D. L. Dimmick, J. Geist, P. J. Grother, S. A. Janet, and C.\n",
      "L. Wilson, NIST Form-Based Handprint Recognition System, NISTIR 5469,\n",
      "1994.\n",
      "\n",
      ".. topic:: References\n",
      "\n",
      "  - C. Kaynak (1995) Methods of Combining Multiple Classifiers and Their\n",
      "    Applications to Handwritten Digit Recognition, MSc Thesis, Institute of\n",
      "    Graduate Studies in Science and Engineering, Bogazici University.\n",
      "  - E. Alpaydin, C. Kaynak (1998) Cascading Classifiers, Kybernetika.\n",
      "  - Ken Tang and Ponnuthurai N. Suganthan and Xi Yao and A. Kai Qin.\n",
      "    Linear dimensionalityreduction using relevance weighted LDA. School of\n",
      "    Electrical and Electronic Engineering Nanyang Technological University.\n",
      "    2005.\n",
      "  - Claudio Gentile. A New Approximate Maximal Margin Classification\n",
      "    Algorithm. NIPS. 2000.\n"
     ]
    }
   ],
   "source": [
    "print(digits.DESCR)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1797, 64)"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1797,)"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 洗牌\n",
    "ridx = np.arange(num_insts)\n",
    "np.random.shuffle(ridx)\n",
    "data = data[ridx, :]\n",
    "label = label[ridx]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1519,  619,  114, ...,  249,  351,  426])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ridx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "K-means聚类共用时 0.01839590072631836 秒。\n"
     ]
    }
   ],
   "source": [
    "# 初始化，聚类数为10，最终聚类结果为10张64像素的图片\n",
    "num_clusters = 10\n",
    "kmeans_centers = np.zeros((num_clusters, num_feats))\n",
    "\n",
    "# 暂且先从数据集中选前十张图片作为初始的聚类结果\n",
    "kmeans_centers = data[:num_clusters, :]\n",
    "\n",
    "# 迭代次数为10，将每一次迭代的损失值放在losses列表里\n",
    "num_iters = 10\n",
    "losses = np.zeros(num_iters)\n",
    "start_time = time.time()\n",
    "for i in range(num_iters):\n",
    "    # Compute the distance of each instance to each cluster center. \n",
    "    inst_sqs = np.sum(data * data, axis=1, keepdims=True)\n",
    "    center_sqs = np.sum(kmeans_centers * kmeans_centers, axis=1)\n",
    "    inner_prod = np.dot(data, kmeans_centers.T)\n",
    "    # Get an num_insts x num_centers matrix D. D_ij = ||x_i - u_j||^2\n",
    "    dist = inst_sqs + center_sqs - 2 * inner_prod\n",
    "    # Compute the loss in current iteration.\n",
    "    losses[i] = np.mean(np.min(dist, axis=1))\n",
    "    # Compute cluster assignment in current iteration.\n",
    "    cluster_ids = np.argmin(dist, axis=1)\n",
    "    # Update cluster center.\n",
    "    for j in range(num_clusters):\n",
    "        # d是被划归为j类的所有图片\n",
    "        d = data[cluster_ids == j, :]\n",
    "        kmeans_centers[j, :] = np.mean(d, axis=0)\n",
    "end_time = time.time()\n",
    "print(\"K-means聚类共用时\", end_time - start_time, \"秒。\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "K-means聚类共用时 0.25318241119384766 秒。\n"
     ]
    }
   ],
   "source": [
    "# 张子豪2\n",
    "# 初始化，聚类数为10，最终聚类结果为10张64像素的图片\n",
    "num_clusters = 10\n",
    "kmeans_centers = np.zeros((num_clusters, num_feats))\n",
    "\n",
    "# 暂且先从数据集中选前十张图片作为初始的聚类结果\n",
    "kmeans_centers = data[:num_clusters, :]\n",
    "\n",
    "# 迭代次数为10，将每一次迭代的损失值放在losses列表里\n",
    "num_iters = 10\n",
    "losses = np.zeros(num_iters)\n",
    "dist = np.zeros((num_insts, num_clusters))\n",
    "start_time = time.time()\n",
    "for i in range(num_iters):\n",
    "    \n",
    "    for j in range(num_insts):\n",
    "        dist[j,:] = np.sqrt(np.sum((data[j,:]-kmeans_centers)**2,axis=1))\n",
    "    # Compute the distance of each instance to each cluster center. \n",
    "#     inst_sqs = np.sum(data * data, axis=1, keepdims=True)\n",
    "#     center_sqs = np.sum(kmeans_centers * kmeans_centers, axis=1)\n",
    "#     inner_prod = np.dot(data, kmeans_centers.T)\n",
    "#     # Get an num_insts x num_centers matrix D. D_ij = ||x_i - u_j||^2\n",
    "#     dist = inst_sqs + center_sqs - 2 * inner_prod\n",
    "    # Compute the loss in current iteration.\n",
    "    losses[i] = np.mean(np.min(dist, axis=1))\n",
    "    # Compute cluster assignment in current iteration.\n",
    "    cluster_ids = np.argmin(dist, axis=1)\n",
    "    # Update cluster center.\n",
    "    for j in range(num_clusters):\n",
    "        # d是被划归为j类的所有图片\n",
    "        d = data[cluster_ids == j, :]\n",
    "        kmeans_centers[j, :] = np.mean(d, axis=0)\n",
    "end_time = time.time()\n",
    "print(\"K-means聚类共用时\", end_time - start_time, \"秒。\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1795, 64)"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[2:].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10, 64)"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "kmeans_centers.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "a = np.ones((1795,64))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a[2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "b = np.arange(640).reshape(10,64)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,\n",
       "         13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,\n",
       "         26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,\n",
       "         39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,\n",
       "         52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63],\n",
       "       [ 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,\n",
       "         77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,\n",
       "         90,  91,  92,  93,  94,  95,  96,  97,  98,  99, 100, 101, 102,\n",
       "        103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,\n",
       "        116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127],\n",
       "       [128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140,\n",
       "        141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153,\n",
       "        154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,\n",
       "        167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,\n",
       "        180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191],\n",
       "       [192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204,\n",
       "        205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217,\n",
       "        218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230,\n",
       "        231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243,\n",
       "        244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255],\n",
       "       [256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268,\n",
       "        269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281,\n",
       "        282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,\n",
       "        295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307,\n",
       "        308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319],\n",
       "       [320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332,\n",
       "        333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345,\n",
       "        346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358,\n",
       "        359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371,\n",
       "        372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383],\n",
       "       [384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396,\n",
       "        397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409,\n",
       "        410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422,\n",
       "        423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435,\n",
       "        436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447],\n",
       "       [448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460,\n",
       "        461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473,\n",
       "        474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486,\n",
       "        487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499,\n",
       "        500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511],\n",
       "       [512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524,\n",
       "        525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537,\n",
       "        538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550,\n",
       "        551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563,\n",
       "        564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575],\n",
       "       [576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588,\n",
       "        589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601,\n",
       "        602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614,\n",
       "        615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627,\n",
       "        628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639]])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "c = a[2]-b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10, 64)"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[   1.,    0.,   -1.,   -2.,   -3.,   -4.,   -5.,   -6.,   -7.,\n",
       "          -8.,   -9.,  -10.,  -11.,  -12.,  -13.,  -14.,  -15.,  -16.,\n",
       "         -17.,  -18.,  -19.,  -20.,  -21.,  -22.,  -23.,  -24.,  -25.,\n",
       "         -26.,  -27.,  -28.,  -29.,  -30.,  -31.,  -32.,  -33.,  -34.,\n",
       "         -35.,  -36.,  -37.,  -38.,  -39.,  -40.,  -41.,  -42.,  -43.,\n",
       "         -44.,  -45.,  -46.,  -47.,  -48.,  -49.,  -50.,  -51.,  -52.,\n",
       "         -53.,  -54.,  -55.,  -56.,  -57.,  -58.,  -59.,  -60.,  -61.,\n",
       "         -62.],\n",
       "       [ -63.,  -64.,  -65.,  -66.,  -67.,  -68.,  -69.,  -70.,  -71.,\n",
       "         -72.,  -73.,  -74.,  -75.,  -76.,  -77.,  -78.,  -79.,  -80.,\n",
       "         -81.,  -82.,  -83.,  -84.,  -85.,  -86.,  -87.,  -88.,  -89.,\n",
       "         -90.,  -91.,  -92.,  -93.,  -94.,  -95.,  -96.,  -97.,  -98.,\n",
       "         -99., -100., -101., -102., -103., -104., -105., -106., -107.,\n",
       "        -108., -109., -110., -111., -112., -113., -114., -115., -116.,\n",
       "        -117., -118., -119., -120., -121., -122., -123., -124., -125.,\n",
       "        -126.],\n",
       "       [-127., -128., -129., -130., -131., -132., -133., -134., -135.,\n",
       "        -136., -137., -138., -139., -140., -141., -142., -143., -144.,\n",
       "        -145., -146., -147., -148., -149., -150., -151., -152., -153.,\n",
       "        -154., -155., -156., -157., -158., -159., -160., -161., -162.,\n",
       "        -163., -164., -165., -166., -167., -168., -169., -170., -171.,\n",
       "        -172., -173., -174., -175., -176., -177., -178., -179., -180.,\n",
       "        -181., -182., -183., -184., -185., -186., -187., -188., -189.,\n",
       "        -190.],\n",
       "       [-191., -192., -193., -194., -195., -196., -197., -198., -199.,\n",
       "        -200., -201., -202., -203., -204., -205., -206., -207., -208.,\n",
       "        -209., -210., -211., -212., -213., -214., -215., -216., -217.,\n",
       "        -218., -219., -220., -221., -222., -223., -224., -225., -226.,\n",
       "        -227., -228., -229., -230., -231., -232., -233., -234., -235.,\n",
       "        -236., -237., -238., -239., -240., -241., -242., -243., -244.,\n",
       "        -245., -246., -247., -248., -249., -250., -251., -252., -253.,\n",
       "        -254.],\n",
       "       [-255., -256., -257., -258., -259., -260., -261., -262., -263.,\n",
       "        -264., -265., -266., -267., -268., -269., -270., -271., -272.,\n",
       "        -273., -274., -275., -276., -277., -278., -279., -280., -281.,\n",
       "        -282., -283., -284., -285., -286., -287., -288., -289., -290.,\n",
       "        -291., -292., -293., -294., -295., -296., -297., -298., -299.,\n",
       "        -300., -301., -302., -303., -304., -305., -306., -307., -308.,\n",
       "        -309., -310., -311., -312., -313., -314., -315., -316., -317.,\n",
       "        -318.],\n",
       "       [-319., -320., -321., -322., -323., -324., -325., -326., -327.,\n",
       "        -328., -329., -330., -331., -332., -333., -334., -335., -336.,\n",
       "        -337., -338., -339., -340., -341., -342., -343., -344., -345.,\n",
       "        -346., -347., -348., -349., -350., -351., -352., -353., -354.,\n",
       "        -355., -356., -357., -358., -359., -360., -361., -362., -363.,\n",
       "        -364., -365., -366., -367., -368., -369., -370., -371., -372.,\n",
       "        -373., -374., -375., -376., -377., -378., -379., -380., -381.,\n",
       "        -382.],\n",
       "       [-383., -384., -385., -386., -387., -388., -389., -390., -391.,\n",
       "        -392., -393., -394., -395., -396., -397., -398., -399., -400.,\n",
       "        -401., -402., -403., -404., -405., -406., -407., -408., -409.,\n",
       "        -410., -411., -412., -413., -414., -415., -416., -417., -418.,\n",
       "        -419., -420., -421., -422., -423., -424., -425., -426., -427.,\n",
       "        -428., -429., -430., -431., -432., -433., -434., -435., -436.,\n",
       "        -437., -438., -439., -440., -441., -442., -443., -444., -445.,\n",
       "        -446.],\n",
       "       [-447., -448., -449., -450., -451., -452., -453., -454., -455.,\n",
       "        -456., -457., -458., -459., -460., -461., -462., -463., -464.,\n",
       "        -465., -466., -467., -468., -469., -470., -471., -472., -473.,\n",
       "        -474., -475., -476., -477., -478., -479., -480., -481., -482.,\n",
       "        -483., -484., -485., -486., -487., -488., -489., -490., -491.,\n",
       "        -492., -493., -494., -495., -496., -497., -498., -499., -500.,\n",
       "        -501., -502., -503., -504., -505., -506., -507., -508., -509.,\n",
       "        -510.],\n",
       "       [-511., -512., -513., -514., -515., -516., -517., -518., -519.,\n",
       "        -520., -521., -522., -523., -524., -525., -526., -527., -528.,\n",
       "        -529., -530., -531., -532., -533., -534., -535., -536., -537.,\n",
       "        -538., -539., -540., -541., -542., -543., -544., -545., -546.,\n",
       "        -547., -548., -549., -550., -551., -552., -553., -554., -555.,\n",
       "        -556., -557., -558., -559., -560., -561., -562., -563., -564.,\n",
       "        -565., -566., -567., -568., -569., -570., -571., -572., -573.,\n",
       "        -574.],\n",
       "       [-575., -576., -577., -578., -579., -580., -581., -582., -583.,\n",
       "        -584., -585., -586., -587., -588., -589., -590., -591., -592.,\n",
       "        -593., -594., -595., -596., -597., -598., -599., -600., -601.,\n",
       "        -602., -603., -604., -605., -606., -607., -608., -609., -610.,\n",
       "        -611., -612., -613., -614., -615., -616., -617., -618., -619.,\n",
       "        -620., -621., -622., -623., -624., -625., -626., -627., -628.,\n",
       "        -629., -630., -631., -632., -633., -634., -635., -636., -637.,\n",
       "        -638.]])"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "d = np.power(a[2]-b,2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10, 64)"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [],
   "source": [
    "e = np.sum(d,axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10,)"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "f = np.sqrt(e)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 285.26478927,  770.3090289 , 1276.58293894, 1786.12429579,\n",
       "       2296.75945628, 2807.8917358 , 3319.29149066, 3830.85160245,\n",
       "       4342.51540009, 4854.25009656])"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "distance = (data[2:]-kmeans_centers)**2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "K-means聚类共用时 0.18952274322509766 秒。\n"
     ]
    }
   ],
   "source": [
    "# 张子豪注释版\n",
    "# 初始化，聚类数为10，最终聚类结果为10张64像素的图片\n",
    "num_clusters = 10\n",
    "kmeans_centers = np.zeros((10, 64))\n",
    "\n",
    "# 暂且先从数据集中选前十张图片作为初始的聚类结果\n",
    "kmeans_centers = data[:10, :]\n",
    "\n",
    "# 迭代次数为7，将每一次迭代的损失值放在losses列表里\n",
    "num_iters = 7\n",
    "losses = np.zeros(7)\n",
    "# dist存储每张图片与10个聚类中心图片的距离，是1797*10的矩阵\n",
    "dist = np.zeros((1797, 10))\n",
    "\n",
    "start_time = time.time()\n",
    "for i in range(num_iters):\n",
    "    \n",
    "    for j in range(num_insts):\n",
    "        # 将图片j中的64个像素与聚类结果的10张图片各自的64个像素 做差再平方，得到10*64矩阵\n",
    "        # distance = np.power(data[j,:]-kmeans_centers,2)\n",
    "        distance = (data[j,:]-kmeans_centers)**2\n",
    "        # 对矩阵中每一行求和，得到10*1矩阵，矩阵元素表示图j与每个聚类中心图片的距离平方和\n",
    "        distance = np.sum(distance,axis=1)\n",
    "        # 再开平方\n",
    "        distance = np.sqrt(distance)\n",
    "        dist[j,:] = distance\n",
    "    \n",
    "    # 找到每张图片对应最近聚类中心的距离平均值，作为损失函数\n",
    "    losses[i] = np.mean(np.min(dist,axis=1))\n",
    "    \n",
    "    # 找到每张图片对应的聚类中心\n",
    "    cluster_ids = np.argmin(dist,axis=1)\n",
    "\n",
    "    for j in range(num_clusters):\n",
    "        # d是被划归为j类的所有图片，将d中所有图片取平均作为j类的聚类结果\n",
    "        d = data[cluster_ids == j, :]\n",
    "        kmeans_centers[j, :] = np.mean(d, axis=0)\n",
    "end_time = time.time()\n",
    "\n",
    "print(\"K-means聚类共用时\", end_time - start_time, \"秒。\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.        , 43.05783068, 44.63363099, ..., 39.90679485,\n",
       "        36.20576532, 31.33316207],\n",
       "       [43.05783068,  0.        , 32.35249443, ..., 18.21782344,\n",
       "        32.86631972, 38.23073508],\n",
       "       [44.63363099, 32.35249443,  0.        , ..., 27.10969884,\n",
       "        33.57728071, 35.7752838 ],\n",
       "       ...,\n",
       "       [30.04148586, 46.01060215, 52.83915857, ..., 44.18114564,\n",
       "        48.37783527, 41.20179171],\n",
       "       [42.68180258, 42.7311493 , 52.68847069, ..., 39.59502127,\n",
       "        47.69930674, 51.5090385 ],\n",
       "       [54.39257507, 25.71545165, 36.90825724, ..., 31.47234156,\n",
       "        43.19288294, 45.66233874]])"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "cluster_ids = np.argmin(dist,axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 9, 9, 2, 4, 9, 0, 8, 0])"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cluster_ids[:19]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the loss function. You should observe a curve that is strictly decreasing.\n",
    "plt.figure()\n",
    "plt.plot(np.arange(num_iters), losses, \"o-\", lw=3)\n",
    "plt.grid(True)\n",
    "plt.title(\"Kmeans\")\n",
    "plt.xlabel(\"Iteration Number\")\n",
    "plt.ylabel(\"Objective Loss\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\nAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n0H8AgvmvTeKMVYAAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\nDZ7Dn04Fx2Y3AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP4AAAECCAYAAADesWqHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAADDNJREFUeJzt3V+IXOUdxvHnybohaqLRmmowYiwp\nARHqxiAVRdpIxFRJbyoYUFAq9qIVQwui9aJ44V0QvShC8E8FoxKNgSCtf9CICI12E2ONSSwaI2aN\n7oqRZFWUdX+9mJOShtQ9u933zez+vh8YMrt7Zp53szxzzpk557yOCAHIZcbxHgCA+ig+kBDFBxKi\n+EBCFB9IiOIDCXVF8W1fZftd2+/ZvqNw1sO2B23vKJlzRN45tjfb3mn7Hdu3Fc6bZfsN2281eXeX\nzGsye2y/afvZ0llN3l7bb9vebru/cNZc20/b3m17l+1LCmYtbn6nw7eDtlcXCYuI43qT1CPpfUk/\nkjRT0luSzi+Yd7mkJZJ2VPr95kta0tyfI+lfhX8/S5rd3O+V9Lqknxb+HX8v6XFJz1b6P90r6YxK\nWY9Kurm5P1PS3Eq5PZI+kXRuiefvhjX+xZLei4g9EfGtpCcl/bJUWES8KunzUs9/jLz9EbGtuX9I\n0i5JZxfMi4gYbr7sbW7FjtKyvUDS1ZIeLJVxvNg+VZ0VxUOSFBHfRsQXleKvkPR+RHxY4sm7ofhn\nS/roiK/3qWAxjifbCyX1qbMWLpnTY3u7pEFJL0ZEybz7JN0uabRgxtFC0gu2t9q+pWDOeZKGJD3S\n7Mo8aPvkgnlHuk7SE6WevBuKn4Lt2ZI2SFodEQdLZkXEdxFxoaQFki62fUGJHNvXSBqMiK0lnv97\nXBYRSyStkPRb25cXyjlBnd3CByKiT9KXkoq+ByVJtmdKWinpqVIZ3VD8AUnnHPH1guZ704btXnVK\nvy4inqmV22yWbpZ0VaGISyWttL1XnV20ZbYfK5T1HxEx0Pw7KGmjOruLJeyTtO+ILaan1XkhKG2F\npG0R8WmpgG4o/j8k/dj2ec0r3XWSNh3nMU0a21ZnH3FXRNxbIW+e7bnN/RMlLZe0u0RWRNwZEQsi\nYqE6f7eXI+L6ElmH2T7Z9pzD9yVdKanIJzQR8Ymkj2wvbr51haSdJbKOskoFN/OlzqbMcRURI7Z/\nJ+l5dd7JfDgi3imVZ/sJST+TdIbtfZL+FBEPlcpTZ614g6S3m/1uSfpjRPy1UN58SY/a7lHnhX19\nRFT5mK2SMyVt7Lye6gRJj0fEcwXzbpW0rlkp7ZF0U8Gswy9myyX9pmhO89EBgES6YVMfQGUUH0iI\n4gMJUXwgIYoPJNRVxS98+OVxyyKPvG7L66riS6r5n1v1D0keed2U123FB1BBkQN4bFc9Kqi3t3fc\njxkdHdWMGRN73Vu0aNG4H3PgwAGddtppE8o76aSTxv2YoaEhzZs3b0J5g4OD437M8PCwZs+ePaG8\n/fv3j/sx/8/fb2RkZEKPmyoiwmMtMy2KP3/+/Jpx2rSp7qkES5curZp3//33V8275557quYNDQ1V\nzautTfHZ1AcSovhAQhQfSIjiAwlRfCAhig8kRPGBhCg+kFCr4tec4gpAeWMWv7lo45/VueTv+ZJW\n2T6/9MAAlNNmjV91iisA5bUpfpoproAsJu26+s2FA2qfswxgAtoUv9UUVxGxVtJaqf7ZeQDGp82m\n/rSe4grIaMw1fu0prgCU12ofv5nnrdRcbwAq48g9ICGKDyRE8YGEKD6QEMUHEqL4QEIUH0iI4gMJ\nTdpJOsfTjTfeWDXvoosuqpq3Y8eOqnkrVqyomrd+/fqqedN9Jp02WOMDCVF8ICGKDyRE8YGEKD6Q\nEMUHEqL4QEIUH0iI4gMJUXwgoTZTaD1se9B23eNGARTTZo3/F0lXFR4HgIrGLH5EvCrp8wpjAVAJ\n+/hAQsydByQ0acVn7jxg6mBTH0iozcd5T0j6u6TFtvfZ/nX5YQEoqc2kmatqDARAPWzqAwlRfCAh\nig8kRPGBhCg+kBDFBxKi+EBCFB9IaFrMnffxxx9Xzbvrrruq5u3du7dq3po1a6rmjY6OVs0Da3wg\nJYoPJETxgYQoPpAQxQcSovhAQhQfSIjiAwlRfCAhig8k1OZim+fY3mx7p+13bN9WY2AAymlzrP6I\npD9ExDbbcyRttf1iROwsPDYAhbSZO29/RGxr7h+StEvS2aUHBqCcce3j214oqU/S6yUGA6CO1qfl\n2p4taYOk1RFx8Bg/Z+48YIpoVXzbveqUfl1EPHOsZZg7D5g62ryrb0kPSdoVEfeWHxKA0trs418q\n6QZJy2xvb26/KDwuAAW1mTvvNUmuMBYAlXDkHpAQxQcSovhAQhQfSIjiAwlRfCAhig8kRPGBhKbF\n3HkbNmyomnfKKadUzbv55pur5n399ddV8wYGBqrmdY5Cryei+05dYY0PJETxgYQoPpAQxQcSovhA\nQhQfSIjiAwlRfCAhig8kRPGBhNpcZXeW7Tdsv9XMnXd3jYEBKKfNsfrfSFoWEcPN9fVfs/23iNhS\neGwACmlzld2QNNx82dvcuu+sAwCttdrHt91je7ukQUkvRgRz5wFTWKviR8R3EXGhpAWSLrZ9wdHL\n2L7Fdr/t/skeJIDJNa539SPiC0mbJV11jJ+tjYilEbF0sgYHoIw27+rPsz23uX+ipOWSdpceGIBy\n2ryrP1/So7Z71HmhWB8Rz5YdFoCS2ryr/09JfRXGAqASjtwDEqL4QEIUH0iI4gMJUXwgIYoPJETx\ngYQoPpDQtJg7b3h4eOyFJtHpp59eNe/aa6+tmvfSSy9VzRscHKya141z2dXGGh9IiOIDCVF8ICGK\nDyRE8YGEKD6QEMUHEqL4QEIUH0iI4gMJtS5+M6nGm7a50CYwxY1njX+bpF2lBgKgnrZTaC2QdLWk\nB8sOB0ANbdf490m6XdJowbEAqKTNTDrXSBqMiK1jLMfcecAU0WaNf6mklbb3SnpS0jLbjx29EHPn\nAVPHmMWPiDsjYkFELJR0naSXI+L64iMDUAyf4wMJjevSWxHxiqRXiowEQDWs8YGEKD6QEMUHEqL4\nQEIUH0iI4gMJUXwgIYoPJDQt5s6bOXNm1bxVq1ZVzTvrrLOq5m3atKlqXu3f76uvvqqaNzQ0VDWv\nDdb4QEIUH0iI4gMJUXwgIYoPJETxgYQoPpAQxQcSovhAQhQfSKjVIbvNpbUPSfpO0giX0AamtvEc\nq//ziPis2EgAVMOmPpBQ2+KHpBdsb7V9S8kBASiv7ab+ZRExYPuHkl60vTsiXj1ygeYFgRcFYApo\ntcaPiIHm30FJGyVdfIxlmDsPmCLazJZ7su05h+9LulLSjtIDA1BOm039MyVttH14+ccj4rmiowJQ\n1JjFj4g9kn5SYSwAKuHjPCAhig8kRPGBhCg+kBDFBxKi+EBCFB9IiOIDCTkiJv9J7cl/0u+xcOHC\nmnHasmVL1byenp6qef39/VXzZs2aVTXv+eefr5q3Zs2aalkjIyOKCI+1HGt8ICGKDyRE8YGEKD6Q\nEMUHEqL4QEIUH0iI4gMJUXwgIYoPJNSq+Lbn2n7a9m7bu2xfUnpgAMppO6HG/ZKei4hf2Z4p6aSC\nYwJQ2JjFt32qpMsl3ShJEfGtpG/LDgtASW029c+TNCTpEdtv2n6wmVjjv9i+xXa/7bqndgEYtzbF\nP0HSEkkPRESfpC8l3XH0QkyhBUwdbYq/T9K+iHi9+fppdV4IAExRYxY/Ij6R9JHtxc23rpC0s+io\nABTV9l39WyWta97R3yPppnJDAlBaq+JHxHZJ7LsD0wRH7gEJUXwgIYoPJETxgYQoPpAQxQcSovhA\nQhQfSKjtkXtd7Ztvvqmad+DAgap5ixYtqprX19dXNe+DDz6omnfo0KGqeTNm1Fu/2mNOmyeJNT6Q\nEsUHEqL4QEIUH0iI4gMJUXwgIYoPJETxgYQoPpDQmMW3vdj29iNuB22vrjE4AGWMechuRLwr6UJJ\nst0jaUDSxsLjAlDQeDf1r5D0fkR8WGIwAOoYb/Gvk/REiYEAqKd18Ztr6q+U9NT/+Dlz5wFTxHhO\ny10haVtEfHqsH0bEWklrJcl2TMLYABQynk39VWIzH5gWWhW/mRZ7uaRnyg4HQA1tp9D6UtIPCo8F\nQCUcuQckRPGBhCg+kBDFBxKi+EBCFB9IiOIDCVF8ICGKDyTkiMk/n8b2kKSJnLN/hqTPJnk43ZBF\nHnm18s6NiHljLVSk+BNluz8ilk63LPLI67Y8NvWBhCg+kFC3FX/tNM0ij7yuyuuqfXwAdXTbGh9A\nBRQfSIjiAwlRfCAhig8k9G96ALrUcFTX6gAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Visualize the center of each cluster. Roughly, you should observe digits 0~9.\n",
    "for j in range(num_clusters):\n",
    "    plt.figure()\n",
    "    plt.gray()\n",
    "    plt.matshow(kmeans_centers[j].reshape(8, 8))\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10, 64)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "kmeans_centers.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1212.17028381,  756.18592022,  709.57938297,  679.01996026,\n",
       "        673.19426842,  670.89028771,  669.41010061,  668.91528006,\n",
       "        668.70261364,  668.5837532 ])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "losses"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([9.35517647e+02, 1.81898940e-12, 1.39381129e+03, 1.30876443e+03,\n",
       "       1.50975584e+03, 1.04747857e+03, 9.89890451e+02, 1.19172287e+03,\n",
       "       5.40591520e+02, 1.09460489e+03])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dist[1]\n",
    "# 表示第一张图片与十个聚类中心的距离"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.argmin(dist[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1797,)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.min(dist,axis=1).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.8189894035458565e-12"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.min(dist,axis=1)[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.        ,  1.45524216, 11.83929356, ..., 11.63419514,\n",
       "         6.33934278,  0.40175603],\n",
       "       [ 0.        ,  1.        , 15.        , ..., 15.        ,\n",
       "        11.        ,  1.        ],\n",
       "       [ 0.        ,  0.        ,  4.        , ...,  6.        ,\n",
       "         0.        ,  0.        ],\n",
       "       ...,\n",
       "       [ 0.        ,  2.        , 16.        , ..., 12.        ,\n",
       "         7.        ,  0.        ],\n",
       "       [ 0.        ,  3.        , 15.        , ..., 12.        ,\n",
       "        11.        ,  1.        ],\n",
       "       [ 0.        ,  4.        , 16.        , ..., 16.        ,\n",
       "         7.        ,  0.        ]])"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d\n",
    "# d是被划归为j类的所有图片"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(111, 64)"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d.shape"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
